/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * ValorPresenteJInternalFrame.java
 *
 * Created on 05-27-2010, 10:21:16 PM
 */
package jepi.ui;

import db.MySQLManager;
import java.awt.BorderLayout;
import java.beans.PropertyVetoException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.swing.DefaultListModel;
import javax.swing.JDesktopPane;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import jepi.CostoBeneficioProyecto;
import jepi.Proyecto;
import validadores.validadoresformato.DoubleValidador;

/**
 *
 * @author Steve
 */
public class ValorPresenteJInternalFrame extends javax.swing.JInternalFrame {

    List<Proyecto> listadoProyectos;
    float[][] totales;
    DefaultListModel proyectosListModel;
    String conclucion;

    /** Creates new form ValorPresenteJInternalFrame */
    public ValorPresenteJInternalFrame() {
        initComponents();
        listadoProyectos = new ArrayList<Proyecto>();
        proyectosListModel = new DefaultListModel();
        proyectosList.setModel(proyectosListModel);
        tasaValidador.configurarValidacion(interesTextField, true, "Ingrese la tasa de descuento",
                new DoubleValidador("Ingrese la tasa de descuento", DoubleValidador.CONFIGURACIONES.POSITIVO, "Ingrese un valor numerico"));
        jScrollPane2.setViewportView(proyectosPanel);
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        proyectosPanel = new javax.swing.JPanel();
        jScrollPane1 = new javax.swing.JScrollPane();
        proyectosList = new javax.swing.JList();
        jLabel1 = new javax.swing.JLabel();
        agregarProyectoButton = new javax.swing.JButton();
        eliminarProyectoButton = new javax.swing.JButton();
        jScrollPane2 = new javax.swing.JScrollPane();
        evaluarButton = new javax.swing.JButton();
        interesTextField = new javax.swing.JTextField();
        jLabel2 = new javax.swing.JLabel();
        tasaValidador = new validadores.api.ValidadorJTextComponent();
        jLabel3 = new javax.swing.JLabel();
        jPanel1 = new javax.swing.JPanel();
        conclucionLabel = new javax.swing.JLabel();
        reporteButton = new javax.swing.JButton();

        proyectosPanel.setLayout(new java.awt.GridLayout(10, 1, 0, 30));

        setClosable(true);
        setIconifiable(true);
        setMaximizable(true);
        setResizable(true);
        setTitle("Evaluacion por Valor Presente");

        jScrollPane1.setViewportView(proyectosList);

        jLabel1.setText("Proyectos Seleccionados:");

        agregarProyectoButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/create.png"))); // NOI18N
        agregarProyectoButton.setText("Agregar...");
        agregarProyectoButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                agregarProyectoButtonActionPerformed(evt);
            }
        });

        eliminarProyectoButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/delete.png"))); // NOI18N
        eliminarProyectoButton.setText("Quitar");
        eliminarProyectoButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                eliminarProyectoButtonActionPerformed(evt);
            }
        });

        evaluarButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/ok.png"))); // NOI18N
        evaluarButton.setText("Evaluar");
        evaluarButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                evaluarButtonActionPerformed(evt);
            }
        });

        jLabel2.setText("Tasa de descuento:");

        jLabel3.setText("%");

        jPanel1.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(0, 0, 0), 2, true));

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(conclucionLabel, javax.swing.GroupLayout.DEFAULT_SIZE, 593, Short.MAX_VALUE)
                .addContainerGap())
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addComponent(conclucionLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 22, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(37, Short.MAX_VALUE))
        );

        reporteButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/abrir.png"))); // NOI18N
        reporteButton.setText("Reporte");
        reporteButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                reporteButtonActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 617, Short.MAX_VALUE)
                        .addContainerGap())
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jLabel1)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 374, Short.MAX_VALUE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(eliminarProyectoButton, javax.swing.GroupLayout.DEFAULT_SIZE, 111, Short.MAX_VALUE)
                            .addComponent(agregarProyectoButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                        .addGap(4, 4, 4))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 123, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(interesTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 71, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jLabel3)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(tasaValidador, javax.swing.GroupLayout.DEFAULT_SIZE, 398, Short.MAX_VALUE)
                        .addGap(4, 4, 4))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(evaluarButton, javax.swing.GroupLayout.PREFERRED_SIZE, 141, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(reporteButton, javax.swing.GroupLayout.PREFERRED_SIZE, 130, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addContainerGap())
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addContainerGap())))
        );

        layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {evaluarButton, reporteButton});

        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel1)
                            .addComponent(agregarProyectoButton, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(eliminarProyectoButton, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addComponent(jScrollPane1, 0, 0, Short.MAX_VALUE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(jLabel2)
                        .addComponent(interesTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(jLabel3))
                    .addComponent(tasaValidador, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(evaluarButton, javax.swing.GroupLayout.PREFERRED_SIZE, 31, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(reporteButton, javax.swing.GroupLayout.PREFERRED_SIZE, 27, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 241, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
        );

        layout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {agregarProyectoButton, eliminarProyectoButton});

        layout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {evaluarButton, reporteButton});

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void agregarProyectoButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_agregarProyectoButtonActionPerformed
        BuscarProyectoJDialog bpd = new BuscarProyectoJDialog(null, true);
        bpd.setVisible(true);
        if (bpd.getReturnStatus() == BuscarProyectoJDialog.RET_OK) {
            agregarProyecto(bpd.getProyectoSeleccionado());
        }
    }//GEN-LAST:event_agregarProyectoButtonActionPerformed

    private void eliminarProyectoButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_eliminarProyectoButtonActionPerformed
        quitarProyecto(proyectosList.getSelectedIndex());
    }//GEN-LAST:event_eliminarProyectoButtonActionPerformed

    private void evaluarButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_evaluarButtonActionPerformed
        if (tasaValidador.validar() && listadoProyectos.size() > 0) {
            totales = new float[listadoProyectos.size()][2];
            proyectosPanel.removeAll();
            float tasa = Float.parseFloat(interesTextField.getText()) / 100f;
            int cproy = 0;
            for (Iterator<Proyecto> it = listadoProyectos.iterator(); it.hasNext();) {
                Proyecto proyecto = it.next();
                CostoBeneficioProyecto cbp = new CostoBeneficioProyecto();
                float[] costos = cbp.obtenerCostos(proyecto.getIdProyecto());
                float[] beneficios = cbp.obtenerBeneficios(proyecto.getIdProyecto());
                float[] factores = new float[costos.length];
                float[] vpb = new float[costos.length];
                float[] vpc = new float[costos.length];

                for (int i = 0; i < factores.length; i++) {
                    factores[i] = (float) 1.0 / (float) (Math.pow(1 + tasa, i + 1));
                    vpc[i] = costos[i] * factores[i];
                    vpb[i] = beneficios[i] * factores[i];
                    totales[cproy][0] = totales[cproy][0] + vpc[i];
                    totales[cproy][1] = totales[cproy][1] + vpb[i];
                }
                String unidadTiempo = "Periodo";
                try {
                    unidadTiempo = MySQLManager.ejecutarConsultaSelect("select cut.descripcion as descrip from proyecto p "
                            + "inner join catalogo_unidad_tiempo cut on p.id_unidad_tiempo=cut.id_unidad_tiempo "
                            + "where p.id_proyecto=" + proyecto.getIdProyecto(), true).getString("descrip");
                } catch (SQLException ex) {
                    System.out.println(ex);
                }

                JTable jt = new JTable(crearTableModel(costos, beneficios, factores, vpc, vpb, unidadTiempo));
                JPanel con = new JPanel(new BorderLayout());
                con.add(new JLabel("<html><font size=6> Proyecto: " + proyecto.getNombre() + "</font></html>"), BorderLayout.NORTH);
                con.add(new JScrollPane(jt));
                if (totales[cproy][1] > totales[cproy][0]) {
                    con.add(new JLabel("<html><b>Los beneficios del proyecto son mayores que sus costos (Con una diferencia de $" + (totales[cproy][1] - totales[cproy][0]) + "). "
                            + "<br><font color=green>Por lo tanto el proyecto es factibe</font></b></html>"), BorderLayout.SOUTH);
                } else {
                    con.add(new JLabel("<html><b>Los costos del proyecto son mayores que sus beneficios (Con una diferencia de $" + (totales[cproy][0] - totales[cproy][1]) + "). "
                            + "<br><font color=red>Por lo tanto el proyecto no es factibe</font></b></html>"), BorderLayout.SOUTH);
                }
                proyectosPanel.add(con);
                jt.setPreferredScrollableViewportSize(jt.getPreferredSize());

                jScrollPane2.repaint();
                jScrollPane2.updateUI();
                proyectosPanel.repaint();
                proyectosPanel.updateUI();
                cproy++;
            }
            int seleccionado = 0;
            float max = totales[0][1] - totales[0][0];
            for (int i = 1; i < totales.length; i++) {
                if (max < totales[i][1] - totales[i][0]) {
                    max = totales[i][1] - totales[i][0];
                    seleccionado = i;
                }
            }
            Proyecto p = listadoProyectos.get(seleccionado);
            conclucionLabel.setText("<html><font size=4>"
                    + "Se recomienda seleccionar el proyecto <b>" + p.getNombre() + "</b> ya que proporciona los mayores beneficios"
                    + "</font></html>");
            conclucion="Se recomienda seleccionar el proyecto " + p.getNombre() + " ya que proporciona los mayores beneficios";

        }
    }//GEN-LAST:event_evaluarButtonActionPerformed

    private void reporteButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_reporteButtonActionPerformed
        evaluarButtonActionPerformed(null);
        try {
            JDesktopPane m = (JDesktopPane) this.getParent();
           String proys="(";
            for (Proyecto p : listadoProyectos) {
                proys+=p.getIdProyecto()+",";
            }
            proys=proys.substring(0, proys.length()-1)+")";

            ReporteVPJInternalFrame internalFrame = new ReporteVPJInternalFrame(proys, new Float(interesTextField.getText())/100, conclucion);
            internalFrame.setVisible(true);
            m.add(internalFrame, javax.swing.JLayeredPane.DEFAULT_LAYER);
            internalFrame.setMaximum(false);
            internalFrame.setSelected(true);
        } catch (PropertyVetoException ex) {
            System.out.println(ex);
        }
    }//GEN-LAST:event_reporteButtonActionPerformed
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton agregarProyectoButton;
    private javax.swing.JLabel conclucionLabel;
    private javax.swing.JButton eliminarProyectoButton;
    private javax.swing.JButton evaluarButton;
    private javax.swing.JTextField interesTextField;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JList proyectosList;
    private javax.swing.JPanel proyectosPanel;
    private javax.swing.JButton reporteButton;
    private validadores.api.ValidadorJTextComponent tasaValidador;
    // End of variables declaration//GEN-END:variables

    private void agregarProyecto(Proyecto proyectoSeleccionado) {
        listadoProyectos.add(proyectoSeleccionado);
        proyectosListModel.addElement(proyectoSeleccionado.getNombre());
        proyectosList.repaint();
    }

    private void quitarProyecto(int indice) {
        listadoProyectos.remove(indice);
        proyectosListModel.remove(indice);
        proyectosList.repaint();
    }

    private javax.swing.table.DefaultTableModel crearTableModel(float[] costos, float[] beneficios, float[] factores, float[] vpc, float[] vpb, String unidadTiempo) {
        String[][] datos = new String[6][costos.length + 2];
        datos[0] = floatToString(costos, "Costos", true);
        datos[1] = floatToString(factores, "Factor", false);
        datos[2] = floatToString(vpc, "Valor Presente Costo", true);
        datos[3] = floatToString(beneficios, "Beneficios", true);
        datos[4] = floatToString(factores, "Factor", false);
        datos[5] = floatToString(vpb, "Valor Presente Beneficio", true);
        String[] h = new String[costos.length + 2];

        h[0] = "";
        for (int i = 1; i < h.length - 1; i++) {
            h[i] = unidadTiempo + " " + (i);
        }
        h[h.length - 1] = "Total";
        return new javax.swing.table.DefaultTableModel(datos, h);
    }

    private String[] floatToString(float[] datos, String nombreFila, boolean sumar) {
        String[] ret = new String[datos.length + 2];
        ret[0] = nombreFila;
        for (int i = 0; i < datos.length; i++) {
            ret[i + 1] = String.valueOf(datos[i]);
        }
        if (sumar) {
            float suma = 0.0f;
            for (int j = 0; j < datos.length; j++) {
                suma = suma + datos[j];
            }
            ret[ret.length - 1] = String.valueOf(suma);
        } else {
            ret[ret.length - 1] = "";
        }
        return ret;
    }
}

